package com.czk.netty.netty.codec2;

import com.czk.netty.netty.codec.StudentPOJO;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * 自定义handler需要继承netty规定好的某个handler适配器
 * 自定义的handler才能成为handler
 *
 * @Author:ChenZhangKun
 * @Date: 2021/1/13 22:43
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    /**
     * ChannelHandlerContext 上下文对象，含有管道pipeline,通道channel,地址等
     * Object 客户端发送的数据，默认是Object的形式
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 从客户端读取
        MyDataInfo.MyMessage message=( MyDataInfo.MyMessage)msg;
        // 根据数据类型显示不同的类型
        MyDataInfo.MyMessage.DataType dataType = message.getDataType();
        if (dataType==MyDataInfo.MyMessage.DataType.StudentType){
            // 学生
            MyDataInfo.Student student = message.getStudent();
            System.out.println("学生id"+student.getId());
            System.out.println("学生名称"+student.getName());
        }else if (dataType==MyDataInfo.MyMessage.DataType.WorkerType){
            // 工人
            MyDataInfo.Worker worker = message.getWoker();
            System.out.println("工人年龄"+worker.getAge());
            System.out.println("工人名称"+worker.getName());
        }else {
            System.out.println("传输类型不对");
        }
    }

    /**
     * 读取完毕写回操作
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 将数据写入缓存并刷新
        // 一般讲对发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端", CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println(cause.getMessage());
        // 关闭连接
        ctx.close();
    }
}
